package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.entity.SetmealDto;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 程达
 * @PackageName:com.itheima.reggie.service.impl
 * @ClassName:SetmealServiceImpl
 * @Description:
 * @date 2022/5/25 16:32
 **/
@Service
@Slf4j
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
    @Autowired
    SetmealDishService setmealDishService;//因为需要存数据到这张表

    /**
     * 新增套餐，同时需要保存套餐和菜品的关联关系
     *
     * @param setmealDto
     */
    @Override
    @Transactional//保存2张表的数据，要开启控制事务
    public void saveWithDish(SetmealDto setmealDto) { //setmealDto 接受到页面全部属性的对象
        // 1:保存基本套餐  用mp的方法
        save(setmealDto);//其实保存的是  setmeal内容..因为setmealDto是setmeal的儿子
        //2.获取套餐关联的菜品集合，并为集合中的每一个元素赋值套餐ID(setmealId)、
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        //  setmealDishes  里面的每个插入中间表数据 少不少关键数据
        // 少了  套餐id
        // 遍历 给每一个 套餐菜品关联数据  设置上套餐id
        //2.1: 保存 套餐和菜品 管理数据
        for (SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(setmealDto.getId());//设置套餐id
        }
        //3.把上面集合的数据批量添加到中间表中
        setmealDishService.saveBatch(setmealDishes);
    }

    @Override
    @Transactional//保存2张表的数据，要开启控制事务
    public void removeByIdsWithDish(List<Long> ids) {
        //        A. 查询该批次套餐中是否存在售卖中的套餐
        //              如果存在, 不允许删除
        //        B. 删除套餐数据
        //        C. 删除套餐关联的菜品数据

        //1: 先判断ids到底能不能删
        /*
          查要删除的这些id里面有没有 启售状态的 只要>0 就说明有不能删
        select count(*) from setmeal where status=1 and id in(id1,id2,id3) ;
           只要上面这个结果 的值是大于0 就代表有启售状态 套餐 就不能删除
         */
        //1.构建条件查询构造器
        LambdaQueryWrapper<Setmeal> wrapper1 = new LambdaQueryWrapper<>();
        //2.查看启售状态的
        wrapper1.eq(Setmeal::getStatus, 1);
        //3.要批量删除id们
        wrapper1.in(Setmeal::getId, ids);
        //4.统计这样的个数是不是>0.>0不能删
        count(wrapper1);
        //5.如果存在, 不允许删除
        if (count() > 0) {
            throw new CustomException("有关联数据，不许删除");
        }
        //6.先删除套餐数据
        //如果能删 删除 套餐的同时 还要删除 套餐菜品关系表数据.
        //如果没抛异常
        //删除套餐
        removeByIds(ids);
        //7.构建条件查询构造器，删除关联中间表的数据
        // 同时要根据 套餐id 删除关联表数据
        // delete from setmeal_dish where setmeal_id in (ids..)
        LambdaQueryWrapper<SetmealDish> wrapper2 = new LambdaQueryWrapper<>();
        wrapper2.in(SetmealDish::getSetmealId, ids);
        //8.开始删除 这里直接删就行了，上面已经把符合条件的删选完了
        setmealDishService.remove(wrapper2);

    }


}